package co.inventario.datos.sqlserver;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import co.inventario.entidad.DepartamentoDTO;
import co.inventario.entidad.PaisDTO;

public class DepartamentoDAOSQLServer {

	private String crearSQL;
	private String actualizarSQL;
	private String consultarSQL;

	public DepartamentoDAOSQLServer() {
		crearSQL = "";
		actualizarSQL = "";
		consultarSQL = "";
	}

	public void crear(DepartamentoDTO departamentoDTO, Connection connection) throws SQLException {
		crearSQL = "INSERT INTO Departamento (Nv_Nombre_Departamento, In_Codigo_Pais) VALUES (?, ?)";
		try (PreparedStatement preparedStatement = connection.prepareStatement(crearSQL)) {
			preparedStatement.setString(1, departamentoDTO.getNvNombreDepartamento());
			preparedStatement.setInt(2, departamentoDTO.getPaisDTO().getInCodigoPais());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema creando el Departamento: " + exception.getMessage());
		}
	}

	public void actualizar(DepartamentoDTO departamentoDTO, Connection connection) throws SQLException {
		actualizarSQL = "UPDATE Departamento SET Nv_Nombre_Departamento = ISNULL(?, Nv_Nombre_Departamento), In_Codigo_Pais = ISNULL(?, In_Codigo_Pais) WHERE In_Codigo_Departamento = ?";
		try (PreparedStatement preparedStatement = connection.prepareStatement(actualizarSQL)) {
			preparedStatement.setString(1, departamentoDTO.getNvNombreDepartamento());
			preparedStatement.setInt(2, departamentoDTO.getPaisDTO().getInCodigoPais());
			preparedStatement.setInt(3, departamentoDTO.getInCodigoDepartamento());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema actualizando el Departamento: " + exception.getMessage());
		}
	}

	public DepartamentoDTO consultarPorCodigo(DepartamentoDTO departamentoDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Departamento WHERE In_Codigo_Departamento = ?";
		DepartamentoDTO departamentoDTOResultado = null;
		PaisDTO paisDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setInt(1, departamentoDTO.getInCodigoDepartamento());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				if (resultSet.next() == true) {
					departamentoDTOResultado = new DepartamentoDTO();
					departamentoDTOResultado.setInCodigoDepartamento(resultSet.getInt("In_Codigo_Departamento"));
					departamentoDTOResultado.setNvNombreDepartamento(resultSet.getString("Nv_Nombre_Departamento"));
					paisDTO = new PaisDTO();
					paisDTO.setInCodigoPais(resultSet.getInt("In_Codigo_Pais"));
					departamentoDTOResultado.setPaisDTO(paisDTO);
				}
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando el Departamento a traves del codigo: " + exception.getMessage());
		}
		return departamentoDTOResultado;
	}

	public DepartamentoDTO consultarPorNombre(DepartamentoDTO departamentoDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Departamento WHERE Nv_Nombre_Departamento = ?";
		DepartamentoDTO departamentoDTOResultado = null;
		PaisDTO paisDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setString(1, departamentoDTO.getNvNombreDepartamento());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				while (resultSet.next() == true) {
					departamentoDTOResultado = new DepartamentoDTO();
					departamentoDTOResultado.setInCodigoDepartamento(resultSet.getInt("In_Codigo_Departamento"));
					departamentoDTOResultado.setNvNombreDepartamento(resultSet.getString("Nv_Nombre_Departamento"));
					paisDTO = new PaisDTO();
					paisDTO.setInCodigoPais(resultSet.getInt("In_Codigo_Pais"));
					departamentoDTOResultado.setPaisDTO(paisDTO);
				}
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando el Departamento a traves del nombre: " + exception.getMessage());
		}
		return departamentoDTOResultado;
	}

	public ArrayList<DepartamentoDTO> consultarTodo(Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Departamento";
		DepartamentoDTO departamentoDTOResultado = null;
		ArrayList<DepartamentoDTO> departamentoDTOLista = new ArrayList<DepartamentoDTO>();
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				while (resultSet.next() == true) {
					departamentoDTOResultado = new DepartamentoDTO();
					departamentoDTOResultado.setInCodigoDepartamento(resultSet.getInt("In_Codigo_Departamento"));
					departamentoDTOResultado.setNvNombreDepartamento(resultSet.getString("Nv_Nombre_Departamento"));
					PaisDTO paisDTO = new PaisDTO();
					paisDTO.setInCodigoPais(resultSet.getInt("In_Codigo_Pais"));
					departamentoDTOResultado.setPaisDTO(paisDTO);
					departamentoDTOLista.add(departamentoDTOResultado);
				}
			}
		}
		return departamentoDTOLista;
	}
}
